package com.fjnu;

import com.fjnu.aop.DaoAopAspect;
import com.fjnu.dao.UserDao;
import com.fjnu.dao.impl.UserDaoImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

import javax.sql.DataSource;
import java.util.Properties;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
// 扫描 com.fjnu 下所有子包（确保包含 aop、dao、annotation 等）
@ComponentScan(basePackages = "com.fjnu")
// 开启 AOP 代理，proxyTargetClass=true 避免接口代理问题
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class SpringConfig {

    // 1. 配置数据源（确保 db.properties 存在且路径正确）
    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        Properties props = new Properties();
        try {
            // 读取 resources 下的 db.properties（路径必须正确）
            props.load(getClass().getClassLoader().getResourceAsStream("db.properties"));
        } catch (Exception e) {
            // 直接抛出异常，明确提示配置文件问题
            throw new RuntimeException("找不到 db.properties 配置文件", e);
        }

        HikariConfig config = new HikariConfig();
        config.setDriverClassName(props.getProperty("jdbc.driver"));
        config.setJdbcUrl(props.getProperty("jdbc.url"));
        config.setUsername(props.getProperty("jdbc.username"));
        config.setPassword(props.getProperty("jdbc.password"));
        config.setMaximumPoolSize(10);
        config.setMinimumIdle(5);
        return new HikariDataSource(config);
    }


    // 2. 手动注册 UserDao（避免 @Repository 注解遗漏问题）
    @Bean
    public UserDao userDao(DataSource dataSource) {
        UserDaoImpl userDao = new UserDaoImpl();
        userDao.setDataSource(dataSource); // 注入数据源
        return userDao;
    }

    // 3. 手动注册 AOP 切面（即使加了 @Component，手动注册更稳妥）
    @Bean
    public DaoAopAspect daoAopAspect() {
        return new DaoAopAspect();
    }
}